package com.leetcode.周赛.第85场;

/**
 * @author: xiaomi
 * @date: 2021/1/20
 * @description:    838. 推多米诺
 * https://leetcode-cn.com/problems/push-dominoes/
 */
public class B_838_推多米诺 {

    public static void main(String[] args) {

    }

    /**
     * 1.要么从 L/R 入手，要么从 . 入手。看起来从 . 入手比较方便
     * 2.从作用力的方面分析
     * @param dominoes
     * @return
     */
    public String pushDominoes(String dominoes) {
        char[] chars = dominoes.toCharArray();
        int len = chars.length;
        for (int i = 0; i < len; i++) {
            //1.寻找 . 段的第一个位置
            if (chars[i] == '.') {
                //2.判断是否有 left 的 push
                boolean leftPush = i > 0 && chars[i - 1] == 'R';
                //3.开始寻找 . 段的最后一个位置
                int j = i + 1;
                for (; j < len; j++) {
                    if (chars[j] != '.') {
                        break;
                    }
                }
                //此时 j 就是 开区间
                boolean rightPush = j < len && chars[j] == 'L';
                if (leftPush && !rightPush) {
                    //只有左边的 push
                    for (; i < j; i++) {
                        chars[i] = 'R';
                    }
                } else if (!leftPush && rightPush) {
                    //只有右边的 push
                    for (; i < j; i++) {
                        chars[i] = 'L';
                    }
                } else if (leftPush && rightPush) {
                    //如果 两边都有 push
                    //使用两个指针
                    int begin = i;
                    int end = j - 1;
                    while (begin < end) {
                        chars[begin++] = 'R';
                        chars[end--] = 'L';
                    }
                    i = j;
                }
            }
        }
        return new String(chars);
    }
}

